import 'package:dio/dio.dart';
import 'dart:convert' as convert;

import 'package:flutter_common_util/net/base_response.dart';

///拦截器，根据业务进行编写(请求、返回拦截器)

class DioInterceptors extends Interceptor {
  ///请求时拦截，比如添加header值（处理的比较多）
  @override
  void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
    super.onRequest(options, handler);
  }

  ///返回时结果集处理,(处理的比较多)
  @override
  void onResponse(Response response, ResponseInterceptorHandler handler) {
    if (response.statusCode == 200) {
      print(response.data.toString());
      //判断返回时json还是String
      Map<String, dynamic> map;
      //ResponseType(json 格式、stream 流、plain utf8字符串、bytys,List<int>数据流)
      //常见的方式有 json 和 plain,(后面俩种再完善)
      if (response.requestOptions.responseType == ResponseType.json) {
        //返回json
        map = response.data;
      } else {
        map = convert.jsonDecode(response.data); //json 字符串
      }

      //对数据进行对象转换处理
      // response.data = BaseRespose(
      //     status: map['status'], msg: map['msg'], data: map['data']);
      response.data = BaseResponse.fromJson(map);
    }
    // else {
    //   //网络出现其他状态值，
    //   response.data = BaseRespose(
    //     status: response.statusCode,
    //     msg: response.statusMessage,
    //   );
    // }

    // 对某些单独的url返回数据做特殊处理
    // if (response.requestOptions.baseUrl.contains("xxxx")) {
    //   // ...
    // }

    //根据公司的业务需求进行定制化处理

    ///重点
    handler.next(response);
  }

  ///出现错误处理,一般不处理
  @override
  void onError(DioError err, ErrorInterceptorHandler handler) {
    switch (err.type) {
      // 连接服务器超时
      case DioErrorType.connectTimeout:
        {
          // 根据自己的业务需求来设定该如何操作
          print(err.message);
        }
        break;
      // 响应超时
      case DioErrorType.receiveTimeout:
        {
          // 根据自己的业务需求来设定该如何操作
          print(err.message);
        }
        break;
      // 发送超时
      case DioErrorType.sendTimeout:
        {
          // 根据自己的业务需求来设定该如何操作
          print(err.message);
        }
        break;
      // 请求取消
      case DioErrorType.cancel:
        {
          // 根据自己的业务需求来设定该如
          // 何操作
          print(err.message);
        }
        break;
      // 404/503
      case DioErrorType.response:
        {
          // 根据自己的业务需求来设定该如何操作
          print(err.message);
        }

        break;
      // other 其他错误类型
      case DioErrorType.other:
        {
          // 根据自己的业务需求来设定该如何操作
          print(err.message);
        }
        break;
    }
    super.onError(err, handler);
  }
}
